package studio.raptor.dispatcher.server.sort;

/**
 * 排序五个规则：客户、账户、销售品、产品、业务动作
 * @author jack
 * @since 1.0
 */
public abstract class SortRule {

  /**
   * 规则一：
   * 依赖条件： 如果当前任务的客户ID在本规则的map中存在，则构成依赖，被依赖任务ID从map对应位置取得；
   * 被依赖条件： 如果当前任务的动作=新增客户，则产生一条被依赖条件，依赖判断标识=当前任务的客户ID，依赖判断任务ID=当前任务ID；
   * @return
   */
  public abstract SortRule sortByParty();

  /**
   * 规则二：
   * 依赖条件： 如果当前任务的账户ID在本规则的map中存在，则构成依赖，被依赖任务ID从map对应位置取得；
   * 被依赖条件： 如果当前任务的动作=新增账户，则产生一条被依赖条件，依赖判断标识=当前任务的账户ID，依赖判断任务ID=当前任务ID
   * 说明:正向map是一对多的关系，比如一个eventId对应多个acctId
   *      反向map是多对一的关系,比如一个acctId对应多个eventId
   *      要建立正向map与反向map一一对应的关系，在map值替换的时候，需要先把老值删除，还要判断老map中的值是否都清空了才能删除
   * @return
   */
  public abstract SortRule sortByAcct();

  /**
   * 规则三：
   * 依赖条件：如果当前任务的产品ID在本规则的map中存在，则构成依赖，被依赖任务ID从map对应位置取得；
   * 被依赖条件： 如果当前任务的动作=产品动作，如果存在依赖，则更新依赖判断任务ID=当前任务ID，否则则产生一条被依赖条件，依赖判断标识=当前任务的产品ID，依赖判断任务ID=当前任务ID	 * @param eventId
   * @return
   */
  public abstract SortRule sortByProd();

  /**
   * 规则四：
   * 依赖条件：如果当前任务的动作=客户变更，如果当前任务的客户ID在本规则的map中存在，则构成依赖，被依赖任务ID从map对应位置取得；1&6
   * 被依赖条件：如果当前任务的动作=客户变更，如果存在依赖，则更新依赖判断任务ID=当前任务ID，否则则产生一条被依赖条件，依赖判断标识=当前任务的客户ID，依赖判断任务ID=当前任务ID
   * @return
   */
  public abstract SortRule sortByModifyParty();

  /**
   * 规则五：
   * 依赖条件：如果当前任务的动作=账户变更，如果当前任务的账户ID在本规则的map中存在，则构成依赖，被依赖任务ID从map对应位置取得； 2 &7
   * 被依赖条件： 如果当前任务的动作=账户变更，如果存在依赖，则更新依赖判断任务ID=当前账户ID，否则则产生一条被依赖条件，依赖判断标识=当前任务的客户ID，依赖判断任务ID=当前任务ID
   * @return
   */
  public abstract SortRule sortByMofifyAcct();



  /**
   * 规则六：
   * 依赖条件：如果当前任务的销售品ID在本规则的map中存在，则构成依赖，被依赖任务ID从map对应位置取得；9 存在销售品
   * 被依赖条件：如果当前任务的动作=销售品动作，如果存在依赖，则更新依赖判断任务ID=当前任务ID，否则则产生一条被依赖条件，依赖判断标识=当前任务的销售品ID，依赖判断任务ID=当前任务ID
   * @return
   */
  public abstract SortRule sortByOffer();


}
